package com.cskaoyan.javase.oop3._2inner._1member._0introduction;

/**
 * 在具体说明成员内部类当中定义成员的特点之前，我们先要明确以下两点：
 *
 *      1.成员内部类可以看成该类的一个成员。
 *          所以，想要得到成员内部类对象，必须先创建外围类对象。
 *          在外围类对象的基础上,才能创建成员内部类对象(类比于对象的成员变量)
 *          为什么成员内部类是这样的呢?
 *          每一个成员内部类对象都会持有外围类对象的引用作为自身成员变量
 *              这是编译器编译代码时加进成员内部类成员列表的
 *
 *      2.创建对象会触发类加载，即便是内部类也不例外。
 *          由1我们可以推导出:
 *              类加载的顺序也应该是先类加载外围类，再类加载成员内部类。
 *              所以，成员内部类没有静态声明。
 *
 *
 *
 *
 *
 * 成员内部类(了解语法,会创建对象,知道成员内部类的成员如何访问即可)
 * 成员内部类是最普通的内部类，它是直接定义在另一个类的成员位置的内部类
 * 可以看成直接将一个类放进另一个类的成员位置,可以看成该类的一个成员。
 *
 * 语法：
 * //外围类
 * [访问权限修饰符] class EnclosedClazz{
 * //成员内部类
 *   [访问权限修饰符] class InnerClazz{
 *  }
 * }
 *
 * 首先研究成员内部类的自身特点
 * 主要从以下几个角度分析：
 *      1.访问权限修饰符,有四种访问级别,和类中成员是一样的,具有相同的访问特点.
 *          既然定义内部类,往往都是希望外部不要访问内部类,所以它的访问权限往往是private
 *          (当然具体情况具体分析)
 *
 *      2.成员特点(成员内部类肯定也是一个类,但是它和普通类的成员定义有区别吗?)
 *          和普通类肯定是有区别的
 *          请大家记住成员内部类成员特点的结论: 成员内部类没有静态声明
 *          具体来说,就是:
 *          成员内部类没有静态成员变量,没有静态方法,没有静态代码块
 *          但是允许定义全局常量,允许定义访问它不会触发类加载,也就是"用字面值常量赋值的全局常量"
 *
 *          总之,之所以采取这种设计,目的还是为了保证成员内部类的访问必须依赖于外围类
 *          而一旦成员内部类有了静态声明,那就是允许成员内部类单独进行访问,用"成员内部类类名点"
 *
 *
 *
 *      3.继承和实现
 *          这都是可以的
 *          成员内部类定义在内部,可以继承外部类,实现外部接口,当然也可以继承内部类,实现内部接口
 *          实际上这种内部类继承实现外部类和接口,是很常见的
 *
 *          思考:
 *          一个外部类,能不能继承对外有访问权限的成员内部类呢?
 *          思考一下,百度一下
 *
 * @since 11:06
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

// 外围类
class EnclosedClazz {
    interface IA {
    }

    abstract class BaseA {

    }

    // 成员内部类
    class InnerClazz extends Demo implements IA, IB {
        int a = 10;
        private int b = 20;
        // static int c = 30;
        static final int D = 40;
        static final String STRING = "hello";
        // static final String STRING2 = new String("hello");

        public void testInner() {
        }
        // public static void testStatic(){}
        // static {}
    }
}

interface IB {
}